MongoDB와 연동
✒️ 2025-05-28 13:26 내용 수정
- 이전에는 MongoDB와 연동에서 Node.js와 MongoDB를 연동했다.
- 진행하고 있는 개인 프로젝트에선 Spring boot를 사용하고 있기에 Spring boot와 MongoDB 연동 방법을 따로 작성하였다.
- 프로젝트에서 MySQL이나 Oracle 대신 MongoDB를 사용한 이유는 현재 프로젝트에서 구현할 체크 리스트나 메모 기능을 Document 형식으로 구현하는 것이 간단하게 구현하기 좋아 보였기 때문이다.
- 아래 기록해둔 방법은 Spring boot의 gradle과 application.properties(또는 application.yml) 파일 설정을 통한 연결 방법이다.
MongoDB 계정 생성
- MongoDB를 참고하여 MongoDB 계정 생성 및 클러스터를 생성한다.
Java로 Spring boot와 연동
- MongoDB#데이터베이스 연결 설정 부분에서 Drivers를 선택한다.
- Driver에서 Java를 선택하고 버전은 최신 버전으로 선택한다. 하단의 connection string을 복사해서 Spring boot 프로젝트의 application.properties(또는 application.yml) 파일에서 mongodb 연결 uri와 database를 추가한다.
- uri만 추가했더니 database이름이 비어 있으면 안된다는 에러가 떠서 아래 참고자료대로 database 설정을 추가했더니 연결되었다.
- 참고 자료 : Bookbookss 스프링부트 mongodb에 연결하기
application.properties파일
spring.data.mongodb.uri=mongodb+srv://<username>:<password>@<clustername>.mongodb.net/?retryWrites=true&w=majority&appName=<clustername>
spring.data.mongodb.database=<dbname>
application.yml파일
spring:
data:
mongodb:
uri: mongodb+srv://<username>:<password>@<clustername>.mongodb.net/?retryWrites=true&w=majority&appName=<clustername>
database: <dbname>
build.gradle에 mongodb 의존성을 추가한다.- 아래 참고자료에 따르면 프로젝트에서 MongoDB만 사용할 경우엔 첫 번째 의존성 구문을 사용하지만, 다른 DB도 사용하는 경우엔 reactive 설정이 들어간 두 번째 의존성 구문을 사용한다고 한다.
- 참고 자료 : 노문택's SpringBoot에서 MongoDB 연동하기
- 다만 실제로 아래의 연결 테스트를 해보니
spring-boot-starter-data-mongodb-reactive만 있으면mongoTemplatebean 등록 관련 오류가 뜨기 때문에 두 구문을 모두 추가해서 해결했다.spring-boot-starter-data-mongodb만 있으면 이 에러가 뜨지 않는다.- 참고 자료 : stackoverflow No bean named 'mongoTemplate' available. Spring Boot + MongoDB
- 다른 DB를 추가할 때
spring-boot-starter-data-mongodb-reactive설정에 대해 좀 더 알아볼 필요가 있을 것 같다.
- 아래 참고자료에 따르면 프로젝트에서 MongoDB만 사용할 경우엔 첫 번째 의존성 구문을 사용하지만, 다른 DB도 사용하는 경우엔 reactive 설정이 들어간 두 번째 의존성 구문을 사용한다고 한다.
- 의존성 구문 작성 후 우측의 gradle 아이콘을 눌러 다운 버튼으로 소스도 받는다.
# MongoDB만 사용할 경우
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
# 다른 DB도 사용할 경우
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
- 프로젝트의 Application 클래스에
@EnableMongoRepositoriesAnnotation을 추가한다.
@EnableMongoRepositoriesAnnotation은 MongoDB repositories를 활성화하기 위한 Annotation이다.
- 프로젝트를 실행하고, 연결이 잘 되었는지 확인한다.
테스트
- 전체적인 구조는 JPA 형식을 따른다.
- MongoDB를 사용 시 Repository를 사용하는 방법과 MongoTemplate을 사용하는 방법이 있다.
- 이 중 JPA를 학습하면서 배웠던 Repository 구조가 익숙했기에 Repository 구조로 작성했다.
- MongoDB와 데이터를 주고 받는 것을 확인하기 위해
src/main/java/projectpackage/에entity패키지를 만들고, 테스트용 클래스를 만든다.- JPA(Java Persistence API)#엔티티(Entity) 참고.
- 참고 자료에서 일부는 Entity, 일부는 Entity와 비슷한 것으로 나와있는데, 편의상 Entity로 이해했다.
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "servernotes") // MongoDB의 collection이름
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Memo {
@Id
private String id;
private String name;
private String content;
}
repository패키지를 만들고,Repository인터페이스를 만든다.Repository는MongoRepository를 상속 받는다.- Repository에 대해서는 JPA(Java Persistence API)#리파지토리(Repository) 참고.
import com.ase.serverckecklist.entity.Memo;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface MemoRepository extends MongoRepository<Memo, String> {
// 연결 테스트를 위해 간단하게 메모를 모두 가져오기만 할 예정
}
service패키지를 만든 후,Service클래스를 작성한다.- Service에 대해서는 Service와 Transaction 참고.
import com.ase.serverckecklist.entity.Memo;
import com.ase.serverckecklist.repository.MemoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@Service
@RequiredArgsConstructor
public class MemoService {
private final MemoRepository memoRepository;
public ArrayList<Memo> index() {
return (ArrayList<Memo>) memoRepository.findAll();
}
}
controller패키지를 만든 후, 테스트용 클래스와 연관된 동작을 수행할 Controller를 작성한다.- 페이지를 보여줄 파일을 통해 데이터를 확인하는 것이 아닌 REST API로 테스트하기 위해
@RestController로 설정했다.
- 페이지를 보여줄 파일을 통해 데이터를 확인하는 것이 아닌 REST API로 테스트하기 위해
import com.ase.serverckecklist.entity.Memo;
import com.ase.serverckecklist.service.MemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
@RestController
public class MemoController {
@Autowired
private MemoService memoService;
@GetMapping("/api/servernotes")
public ArrayList<Memo> index() {
return memoService.index(); // Service에서 DB 동작 수행
}
}
- 이제 DB로부터 가져올 데이터를 추가하기 위해 MongoDB에 접속하여 클러스터를 선택한 후, Collections에서 Add My Own Data를 누른다.
- Create Database에서 Database 이름을 입력하고, Collection 이름을 설정 한 뒤 생성한다.
- Database 이름 : MongoDB와 연동에서
application.properties에 입력한 database 이름과 동일하게 설정 - Collection 이름 : MongoDB와 연동 1번에서 Entity 설정 시 작성한
@Document(collection = "servernotes")이름과 동일하게 설정
- Database 이름 : MongoDB와 연동에서
- 생성된 DB에서 우측에 있는 INSERT DOCUMENT를 누르고, 테스트용 데이터를
Entity의 Field와 동일한 옵션으로 작성한다.
- Spring boot 서버를 다시 가동한 후 웹 브라우저를 열고 Controller에서 설정한 url을 입력해서 DB로부터 데이터를 잘 가져오는지 확인한다.